﻿using System;
using System.Collections.Generic;
using System.Text;
//Phải using lóp DTO để sử dụng các đối tượng đã tạo trong lớp DTO
using DTO;
//Phải using 2 thư viện dưới để dùng các phương thức truy cập database SQLserver
using System.Data.SqlClient;
using System.Data;
//Phải using thư viện dưới để truy cập vào Web.config lấy chuỗi kết nối dữ liệu
using System.Configuration;


namespace DAL
{
    //Tạo ra đối tượng ...DAL tương ứng với các bảng trong cơ sở dữ liệu
    //đối tượng này chứa các phương thức dùng để truy cập vào cơ sở dữ liệu để sử dụng các store procedure đã được viết
    public class TonKhoDAL
    {
        //Tạo ra đối tượng cn để gán chuỗi kết nối conectionstring
        private SqlConnection cn = null;

        //Phương thức khởi dựng của đối tượng ...DAL
        public TonKhoDAL()
        {
            //Lấy chuỗi kết nối trong Web.config gán vào đối tượng tạo kết nối cn
            string stringConnection = ConfigurationSettings.AppSettings["connectionstring"].ToString();
            cn = new SqlConnection(stringConnection);
            //Mở kết nối đến database
            cn.Open();
        }

        //Tạo phương thức insert
        public void INSERT(TonKho D)
        {
            //Tạo mới 1 đối tượng sqlcommand
            SqlCommand cm = new SqlCommand();
            //Gán tên store procedure vào cm, tên store phải giống như store đã tạo trong cơ sở dữ liệu
            cm.CommandText = "sp_TONKHO_Insert";
            //Truyền chuỗi kết nối vào
            cm.Connection = this.cn;
            //Chọn loại command là storedprocedure
            cm.CommandType = CommandType.StoredProcedure;

            //Gán các thuộc tính tương ứng có trong store
            cm.Parameters.AddWithValue("@NgayCapNhat", D.NgayCapNhat);
            cm.Parameters.AddWithValue("@MaSanPham", D.MaSanPham);
            cm.Parameters.AddWithValue("@TongSoLuong", D.TongSoLuong);
            cm.Parameters.AddWithValue("@ConLai", D.ConLai);
            cm.Parameters.AddWithValue("@DaBan", D.DaBan);

            //Thực hiện store
            cm.ExecuteNonQuery();
        }

        //Tạo phương thức update
        public void UPDATE(TonKho D)
        {
            //Tạo mới 1 đối tượng sqlcommand
            SqlCommand cm = new SqlCommand();
            //Gán tên store procedure vào cm, tên store phải giống như store đã tạo trong cơ sở dữ liệu
            cm.CommandText = "sp_TONKHO_Update";
            //Truyền chuỗi kết nối vào
            cm.Connection = this.cn;
            //Chọn loại command là storedprocedure
            cm.CommandType = CommandType.StoredProcedure;

            //Gán các thuộc tính tương ứng có trong store
            cm.Parameters.AddWithValue("@MaTonKho", D.MaTonKho);
            cm.Parameters.AddWithValue("@NgayCapNhat", D.NgayCapNhat);
            cm.Parameters.AddWithValue("@MaSanPham", D.MaSanPham);
            cm.Parameters.AddWithValue("@TongSoLuong", D.TongSoLuong);
            cm.Parameters.AddWithValue("@ConLai", D.ConLai);
            cm.Parameters.AddWithValue("@DaBan", D.DaBan);

            //Thực hiện store
            cm.ExecuteNonQuery();
        }

        //Tạo phương thức delete
        public void DELETE(int iD)
        {
            //Tạo mới 1 đối tượng sqlcommand
            SqlCommand cm = new SqlCommand();
            //Gán tên store procedure vào cm, tên store phải giống như store đã tạo trong cơ sở dữ liệu
            cm.CommandText = "sp_TONKHO_Delete";
            //Truyền chuỗi kết nối vào
            cm.Connection = this.cn;
            //Chọn loại command là storedprocedure
            cm.CommandType = CommandType.StoredProcedure;

            //Gán các thuộc tính tương ứng có trong store
            cm.Parameters.AddWithValue("@MaTonKho", iD);

            //Thực hiện store
            cm.ExecuteNonQuery();
        }

        //Tạo phương thức get (select) dữ liệu
        //Cần truyển vào đủ dữ liệu như trong store gồm: chuỗi dữ liệu where, trang hiện tại, số trang, sort theo cột nào, sort tăng hay giảm, tổng số dòng dữ liệu lấy dược
        public TonKhoCollection GET(string Where, int PageIndex, int PageSize, string OrderBy, string OrderDirection, out int TotalRecords)
        {
            //Tạo mới 1 đối tượng sqlcommand
            SqlCommand cm = new SqlCommand();
            //Gán tên store procedure vào cm, tên store phải giống như store đã tạo trong cơ sở dữ liệu
            cm.CommandText = "sp_TONKHO_Get";
            //Truyền chuỗi kết nối vào
            cm.Connection = this.cn;
            //Chọn loại command là storedprocedure
            cm.CommandType = CommandType.StoredProcedure;

            //Gán các thuộc tính tương ứng có trong store
            cm.Parameters.AddWithValue("@Where", Where);
            cm.Parameters.AddWithValue("@PageIndex", PageIndex);
            cm.Parameters.AddWithValue("@PageSize", PageSize);
            cm.Parameters.AddWithValue("@OrderBy", OrderBy);
            cm.Parameters.AddWithValue("@OrderDirection", OrderDirection);
            SqlParameter param = new SqlParameter("@TotalRecords", DbType.Int32);
            param.Direction = ParameterDirection.Output;
            cm.Parameters.Add(param);

            //Thực hiện store
            SqlDataAdapter da = new SqlDataAdapter(cm);
            DataSet ds = new DataSet();
            //Đổ toàn bộ dữ liệu lấy được vào dataset. Dataset tương tự như database, nó gồm nhiều bảng. Ở đây chỉ là 1 bảng nên khi
            //sử dụng ta dùng ds.Tables[0] sẽ lấy được bảng vừa đổ vào
            da.Fill(ds);

            //Tạo ra đối tượng ...Collection, dùng để chứa dữ liệu và trả ra ngoài
            TonKhoCollection TonKhoCollection = new TonKhoCollection();
            //Chạy vòng lặp hết số dòng có trong Tables[0] của ds
            for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
            {
                //Tạo đối tượng
                TonKho D = new TonKho();

                //Gán dữ liệu trong ds vào đối tượng
                D.MaTonKho = int.Parse(ds.Tables[0].Rows[i]["MaTonKho"].ToString());
                D.NgayCapNhat = DateTime.Parse(ds.Tables[0].Rows[i]["NgayCapNhat"].ToString());
                D.MaSanPham = int.Parse(ds.Tables[0].Rows[i]["MaSanPham"].ToString());
                D.TongSoLuong = int.Parse(ds.Tables[0].Rows[i]["TongSoLuong"].ToString());
                D.ConLai = int.Parse(ds.Tables[0].Rows[i]["ConLai"].ToString());
                D.DaBan = int.Parse(ds.Tables[0].Rows[i]["DaBan"].ToString());

                //Add đối tượng vào danh sách đối tượng
                TonKhoCollection.Add(D);
            }
            //Trả số dòng dữ liệu lấy được ra ngoài
            TotalRecords = int.Parse(cm.Parameters["@TotalRecords"].Value.ToString());
            //Trả danh sách đối tượng lấy được ra ngoài
            return TonKhoCollection;
        }
    }
}
